<!doctype html>
<head>
    <title>jfix test</title>
    <meta http-equiv="Content-Type" content="text/html; charset= utf-8" />
<style type="text/css">

* { margin: 0; padding: 0; border-collapse: collapse }
html, body { background: #f9f9f9 }
body { padding: 1em }
table { border: 1px solid silver; float: left; margin-right: 1em; empty-cells: show }
th, td { text-align: left; border-bottom: 1px solid silver; padding: .2em .4em; background: white }
th { background: #eee }
td {  }
.error { font-weight: bold; background: pink }
.pass { background: #9f9 }

h1, p.h1 { font-size: 2em; font-weight: bold; line-height: 1em }
h1 { position: relative; right: 3px; bottom: 3px }
p.h1 { margin-top: -1em; color: #ddd }

sup, sub { position: absolute; font-weight: bold; font-size: 2em; color: black; top: 0; left: 10em; padding: .5em }
sub { color: #ddd; margin: 3px 0 0 3px }

#tests { border: 1px solid steelblue; display: table; max-width: 100% }
#tests div { display: table-row; border: 1px solid lightsteelblue; zoom: 1 }
#tests b, #tests u, #tests i { display: table-cell; padding: .5em .7em; font-style: normal; text-decoration: none; zoom: 1 }
#tests b { background: #ddf; width: 6% }
#tests u { background: snow; width: 25% }
#tests i { background: #eee; font-family: monospace; }
#tests i + i { background: snow; width: 8% }
#tests .pass { background: #9f9 }
#tests .fail { background: pink }

em { color: green; font-style: normal }
strong { font-style: normal; font-weight: bold }
abbr { color: blue; font-style: normal }
acronym, acronym * { color: red }

</style>
</head>
<body>
<h1 id="h1">[ jfix test ]</h1><p class="h1">[ jfix test ]</p><br/>

<div id="tests">

    <div>
        <b>$</b> <u>корень фреймворка, доступен ото всюду</u>
        <i>typeof $</i> <i>'function'</i>
    </div>
    <div>
        <b>global.$</b> <u>однако, глобальный контекст не засираем</u>
        <i>window.$</i> <i>void 0</i>
    </div>

    <div>
        <b>is..defined</b> <u>всё кроме null и undefined даёт true</u>
        <i>$.is( void 0 ).defined()</i> <i>false</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( null ).defined()</i> <i>false</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( false ).defined()</i> <i>true</i>
    </div>

    <div>
        <b>is..nil</b> <u>является ли null-ом</u>
        <i>$.is( void 0 ).nil()</i> <i>false</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( null ).nil()</i> <i>true</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( false ).nil()</i> <i>false</i>
    </div>

    <div>
        <b>is..bool</b> <u>является ли boolean-ом</u>
        <i>$.is( void 0 ).bool()</i> <i>false</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( 1 ).bool()</i> <i>false</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( true ).bool()</i> <i>true</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( false ).bool()</i> <i>true</i>
    </div>

    <div>
        <b>is..tru</b> <u>является ли истинным значением</u>
        <i>$.is( Infinity ).tru()</i> <i>true</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( true ).tru()</i> <i>true</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( -2 ).tru()</i> <i>true</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( [ 0 ] ).tru()</i> <i>true</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( [ ] ).tru()</i> <i>false</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( void 0 ).tru()</i> <i>false</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( null ).tru()</i> <i>false</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( '' ).tru()</i> <i>false</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( false ).tru()</i> <i>false</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( 0 ).tru()</i> <i>false</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( NaN ).tru()</i> <i>false</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( { toString: function( ){ return '' } } ).tru()</i> <i>false</i>
    </div>

    <div>
        <b>is..nan</b> <u>является ли числом-нечислом</u>
        <i>$.is( NaN ).nan()</i> <i>true</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( Infinity ).nan()</i> <i>false</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( 0 ).nan()</i> <i>false</i>
    </div>

    <div>
        <b>is..infinity</b> <u>является ли бесконечностью</u>
        <i>$.is( -Infinity ).infinity()</i> <i>true</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( NaN ).infinity()</i> <i>false</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( 0 ).infinity()</i> <i>false</i>
    </div>

    <div>
        <b>is..numb</b> <u>является ли числом</u>
        <i>$.is( Infinity ).numb()</i> <i>true</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( 0 ).numb()</i> <i>true</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( NaN ).numb()</i> <i>false</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( '0' ).numb()</i> <i>false</i>
    </div>

    <div>
        <b>is..string</b> <u>является ли строкой</u>
        <i>$.is( '' ).string()</i> <i>true</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( [] ).string()</i> <i>false</i>
    </div>

    <div>
        <b>is..regexp</b> <u>является ли регулярным выражением</u>
        <i>$.is( /./ ).regexp()</i> <i>true</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( '/./' ).regexp()</i> <i>false</i>
    </div>

    <div>
        <b>is..func</b> <u>является ли функцией</u>
        <i>$.is( $ ).func()</i> <i>true</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( /./ ).func()</i> <i>false</i>
    </div>

    <div>
        <b>is..node</b> <u>является ли узлом документа</u>
        <i>$.is( document.getElementById( 'h1' ) ).node()</i> <i>true</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( document.createElement( 'h1' ) ).node()</i> <i>true</i>
    </div>
    <div>
        <b> </b> <u>да, ничего лучше не придумал (-_-)</u>
        <i>$.is( { nodeName: 1 } ).node()</i> <i>true</i>
    </div>

    <div>
        <b>is..array</b> <u>является ли массивом</u>
        <i>$.is( [ ] ).array()</i> <i>true</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( arguments ).array()</i> <i>false</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( x= function( ){ }, x.prototype= [ ], new x ).array()</i> <i>false</i>
    </div>

    <div>
        <b>is..toString</b> <u>возвращает расширенный тип значения</u>
        <i>$.is( void 0 ).toString()</i> <i>'undefined'</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( null ).toString()</i> <i>'null'</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( false ).toString()</i> <i>'boolean'</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( '' ).toString()</i> <i>'string'</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( 0 ).toString()</i> <i>'number'</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( Infinity ).toString()</i> <i>'number'</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( NaN ).toString()</i> <i>'nan'</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( /./ ).toString()</i> <i>'regexp'</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( [ ] ).toString()</i> <i>'array'</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( { } ).toString()</i> <i>'object'</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( arguments ).toString()</i> <i>'object'</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.is( document.createElement( 'h1' ) ).toString()</i> <i>'node'</i>
    </div>

    <div>
        <b>obj..can</b> <u>есть ли определённый метод</u>
        <i>$.obj( { } ).can( 'hasOwnProperty' )</i> <i>true</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.obj( { } ).can( 'hasUnknownProperty' )</i> <i>false</i>
    </div>

    <div>
        <b>obj..method</b> <u>возвращает привязанный метод</u>
        <i>$.obj( { x: function( val ){ return val } } ).method( 'x' )( 2 )</i> <i>2</i>
    </div>

    <div>
        <b>obj..count</b> <u>возвращает количество ключей</u>
        <i>$.obj( { x: 1, y: 2 } ).count()</i> <i>2</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.obj( x= [ 1, 2 ], x[5]= 3, x.length= 10, x ).count()</i> <i>3</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.obj( arguments ).count()</i> <i>0</i>
    </div>

    <div>
        <b>obj..select</b> <u>выбирает значение по ключу</u>
        <i>$.obj( { x: 2 } ).select( 'x' )</i> <i>2</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.obj( { x: 2 } ).select( 'y' )</i> <i>void 0</i>
    </div>

    <div>
        <b>obj..assign</b> <u>ассоциирует значение с ключом</u>
        <i>$.obj( { x: 1 } ).assign( 'x', 2 ).select( 'x' )</i> <i>2</i>
    </div>

    <div>
        <b>obj..remove</b> <u>удаляет ключ</u>
        <i>$.obj( { x: 1 } ).remove( 'x' ).select( 'x' )</i> <i>void 0</i>
    </div>

    <div>
        <b>obj..map</b> <u>прогоняет все значения через функцию</u>
        <i>$.obj( { x: 2 } ).map(function( val ){ return val * 2 }).select( 'x' )</i> <i>4</i>
    </div>

    <div>
        <b>obj..any</b> <u>есть ли среди значений то, которое при протягивании через функцию даст true</u>
        <i>$.obj( { x: 0, y: 1 } ).any(function( val ){ return !!val })</i> <i>true</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.obj( { x: 0, y: NaN } ).any(function( val ){ return !!val })</i> <i>false</i>
    </div>

    <div>
        <b>obj..every</b> <u>все ли значения при протягивании через функцию дают true</u>
        <i>$.obj( { x: '1', y: 1 } ).every(function( val ){ return !!val })</i> <i>true</i>
    </div>
    <div>
        <b> </b> <u> </u>
        <i>$.obj( { x: 0, y: 1 } ).every(function( val ){ return !!val })</i> <i>false</i>
    </div>

    <div>
        <b>obj..keys</b> <u>возвращает список всех ключей</u>
        <i>$.obj( { x: 1, y: 2 } ).keys().join( ',' )</i> <i>'x,y'</i>
    </div>

    <div>
        <b>obj..values</b> <u>возвращает список всех значений</u>
        <i>$.obj( { x: 1, y: 2 } ).values().join( ',' )</i> <i>'1,2'</i>
    </div>

    <div>
        <b>obj..first</b> <u>возвращает первую пару ключ-значение</u>
        <i>$.obj( { x: 1, y: 2 } ).first().val</i> <i>1</i>
    </div>

</div>

<script src="./" type="text/javascript">
/*<![CDATA[*/

function run( code ){
    var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z;
    return eval( code );
};

var encode= function( text ){
    try {
    return String( text )
        .split( '&' ).join( '&amp;' )
        .split( '<' ).join( '&lt;' )
        .split( '>' ).join( '&gt;' )
    } catch( e ){
        return '<big>error</big>';
    }
};

var highlight= function( text ){
    return String( text )
        .replace( /(^|\b|\s)(\$|window|document|navigator)/g, '$1<strong>$2</strong>' )
        .replace( /\.([\w$]+)/g, '.<em>$1</em>' )
        .replace( /\s([\w$]+):/g, ' <em>$1</em>:' )
        .replace( /\b(true|false|void|function|null|typeof|instanceof|in|return|new|arguments|NaN|Infinity)\b/g, '<abbr>$1</abbr>' )
        .replace( /\s(-?\d+)\s/g, ' <abbr>$1</abbr> ' )
        .replace( /(['"])(.*?)\1/g, '<acronym>$1$2$1</acronym>' )
};

var tests= document.getElementById('tests').getElementsByTagName('div');
var passed= true;
for( var i= 0; i < tests.length; ++i ){
    var test= tests[ i ];
    var mess= '';
    var codes= test.getElementsByTagName('i');
    var code1= codes[ 0 ].innerHTML;
    var code2= codes[ 1 ].innerHTML;
    var res1= run( code1 );
    var res2= run( code2 );
    codes[ 0 ].innerHTML= highlight( code1 );
    codes[ 1 ].innerHTML= highlight( code2 );
    //if( res1 === res2 )
        mess= encode( res1 );
    //else mess= encode( res1 ) + ' — ' + encode( res2 );
    var span= document.createElement( 'i' );
    span.innerHTML= mess;
    span.className= ( res1 === res2 ) ? 'pass' : 'fail';
    test.appendChild( span );
    if( res1 !== res2 ) passed= false;
}

if( passed ){
    document.write('<sub>\\(^_^)/</sub>');
    document.write('<sup>\\(^_^)/</sup>');
}

/*]]>*/
</script>

</body>